home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 4
/
Aminet 4 - November 1994.iso
/
aminet
/
dev
/
obero
/
oberon_lib.lha
/
oberon-a
/
source1.lha
/
source
/
Amiga
/
CDDevice.mod
< prev
next >
Wrap
Text File
|
1994-08-08
|
16KB
|
371 lines
(*************************************************************************
$RCSfile: CDDevice.mod $
Description: Interface to cd.device
Created by: fjc (Frank Copeland)
$Revision: 3.1 $
$Author: fjc $
$Date: 1994/08/08 01:16:03 $
$VER: cd.h 1.11 (12.8.93)
Includes Release 40.15
(C) Copyright 1992-1993 Commodore-Amiga, Inc.
All Rights Reserved
Oberon-A Interface Copyright © 1994, Frank Copeland.
This file is part of the Oberon-A Interface.
See Oberon-A.doc for conditions of use and distribution.
*************************************************************************)
MODULE CDDevice;
(*
** $C- CaseChk $I- IndexChk $L+ LongAdr $N- NilChk
** $P- PortableCode $R- RangeChk $S- StackChk $T- TypeChk
** $V- OvflChk $Z- ZeroVars
*)
IMPORT E := Exec, SYS := SYSTEM;
(**************************************************************************
* *
* CD Commands *
* *
**************************************************************************)
CONST
reset * = 1;
read * = 2;
write * = 3;
update * = 4;
clear * = 5;
stop * = 6;
start * = 7;
flush * = 8;
motor * = 9;
seek * = 10;
format * = 11;
remove * = 12;
changeNum * = 13;
changeState * = 14;
protStatus * = 15;
getDriveType * = 18;
getNumTracks * = 19;
addChangeInt * = 20;
remChangeInt * = 21;
getGeometry * = 22;
eject * = 23;
info * = 32;
config * = 33;
tocMSF * = 34;
tocLSN * = 35;
readXL * = 36;
playTrack * = 37;
playMSF * = 38;
playLSN * = 39;
pause * = 40;
search * = 41;
qCodeMSF * = 42;
qCodeLSN * = 43;
attenuate * = 44;
addFrameInt * = 45;
remFrameInt * = 46;
(**************************************************************************
* *
* Device Driver Error Codes *
* *
**************************************************************************)
CONST
errOpenFail * = -1; (* device/unit failed to open *)
errAborted * = -2; (* request terminated early *)
errNoCmd * = -3; (* command not supported by device *)
errBadLength * = -4; (* invalid length (IO_LENGTH/IO_OFFSET) *)
errBadAddress * = -5; (* invalid address (IO_DATA misaligned) *)
errUnitBusy * = -6; (* device opens ok, but unit is busy *)
errSelfTest * = -7; (* hardware failed self-test *)
errNotSpecified * = 20; (* general catchall *)
errNoSecHdr * = 21; (* couldn't even find a sector *)
errBadSecPreamble * = 22; (* sector looked wrong *)
errBadSecID * = 23; (* ditto *)
errBadHdrSum * = 24; (* header had incorrect checksum *)
errBadSecSum * = 25; (* data had incorrect checksum *)
errTooFewSecs * = 26; (* couldn't find enough sectors *)
errBadSecHdr * = 27; (* another "sector looked wrong" *)
errWriteProt * = 28; (* can't write to a protected disk *)
errNoDisk * = 29; (* no disk in the drive *)
errSeekError * = 30; (* couldn't find track 0 *)
errNoMem * = 31; (* ran out of memory *)
errBadUnitNum * = 32; (* asked for a unit > NUMUNITS *)
errBadDriveType * = 33; (* not a drive cd.device understands *)
errDriveInUse * = 34; (* someone else allocated the drive *)
errPostReset * = 35; (* user hit reset; awaiting doom *)
errBadDataType * = 36; (* data on disk is wrong type *)
errInvalidState * = 37; (* invalid cmd under current conditions *)
errPhase * = 42; (* illegal or unexpected SCSI phase *)
errNoBoard * = 50; (* open failed for non-existant board *)
(**************************************************************************
* *
* Configuration *
* *
* The drive is configured by TagList items defined as follows: *
* *
**************************************************************************)
CONST
tagPlaySpeed * = 00001H;
tagReadSpeed * = 00002H;
tagReadXLSpeed * = 00003H;
tagSectorSize * = 00004H;
tagXLECC * = 00005H;
tagEjectReset * = 00006H;
(**************************************************************************
* *
* Information *
* *
* Information/Status structure describes current speed settings *
* for read and play commands, sector size, audio attenuation *
* precision, and drive status. *
* *
**************************************************************************)
TYPE
CDInfoPtr * = CPOINTER TO CDInfo;
CDInfo * = RECORD (* Default *)
playSpeed * : E.UWORD; (* Audio play speed (75) *)
readSpeed * : E.UWORD; (* Data-rate of CD_READ command (Max) *)
readXLSpeed * : E.UWORD; (* Data-rate of CD_READXL command (75) *)
sectorSize * : E.UWORD; (* Number of bytes per sector (2048) *)
xlECC * : E.UWORD; (* CDXL ECC enabled/disabled *)
ejectReset * : E.UWORD; (* Reset on eject enabled/disabled *)
reserved1 * : ARRAY 4 OF E.UWORD; (* Reserved for future expansion *)
maxSpeed * : E.UWORD; (* Maximum speed drive can handle (75, 150) *)
audioPrecision * : E.UWORD; (* 0 = no attenuator, 1 = mute only, *)
(* other = (# levels - 1) *)
status * : E.UWORD; (* See flags below *)
reserved2 * : ARRAY 4 OF E.UWORD; (* Reserved for future expansion *)
END;
CONST
(* Flags for Status *)
stsClosed * = 0; (* Drive door is closed *)
stsDisk * = 1; (* A disk has been detected *)
stsSpin * = 2; (* Disk is spinning (motor is on) *)
stsTOC * = 3; (* Table of contents read. Disk is valid. *)
stsCDRom * = 4; (* Track 1 contains CD-ROM data *)
stsPlaying * = 5; (* Audio is playing *)
stsPaused * = 6; (* Pause mode (pauses on play command) *)
stsSearch * = 7; (* Search mode (Fast Forward/Fast Reverse) *)
stsDirection * = 8; (* Search direction (0 = Forward, 1 = Reverse) *)
(* Modes for CD_SEARCH *)
modeNormal * = 0; (* Normal play at current play speed *)
modeFFwd * = 1; (* Fast forward play (skip-play forward)*)
modeFRev * = 2; (* Fast reverse play (skip-play reverse)*)
(**************************************************************************
* *
* Position Information *
* *
* Position information can be described in two forms: MSF and LSN *
* form. MSF (Minutes, Seconds, Frames) form is a time encoding. *
* LSN (Logical Sector Number) form is frame (sector) count. *
* The desired form is selected using the io_Flags field of the *
* IOStdReq structure. The flags and the union are described *
* below. *
* *
**************************************************************************)
TYPE
RMSFPtr * = CPOINTER TO RMSF;
RMSF * = RECORD
reserved * : E.UBYTE; (* Reserved (always zero) *)
minute * : E.UBYTE; (* Minutes (0-72ish) *)
second * : E.UBYTE; (* Seconds (0-59) *)
frame * : E.UBYTE; (* Frame (0-74) *)
END;
RLSNPtr * = CPOINTER TO RLSN;
RLSN * = RECORD
lsn * : E.ULONG; (* Logical Sector Number *)
END;
(**************************************************************************
* *
* CD Transfer Lists *
* *
* A CDXL node is a double link node; however only single linkage *
* is used by the device driver. If you wish to construct a *
* transfer list manually, it is only neccessary to define the *
* mln_Succ pointer of the MinNode. You may also use the Exec *
* list functions by defining a List or MinList structure and by *
* using the AddHead/AddTail functions to create the list. This *
* will create a double-linked list. Although a double-linked *
* list is not required by the device driver, you may wish use it *
* for your own purposes. Don't forget to initialize the *
* the List/MinList before using it! *
* *
**************************************************************************)
TYPE
CDXLPtr * = CPOINTER TO CDXL;
CDXL * = RECORD (E.MinNode) (* double linkage *)
buffer * : E.APTR; (* data destination (word aligned) *)
length * : LONGINT; (* must be even # bytes *)
actual * : LONGINT; (* bytes transferred *)
intData * : E.APTR; (* interrupt server data segment *)
IntCode * : E.PROC; (* interrupt server code entry *)
END;
(**************************************************************************
* *
* CD Table of Contents *
* *
* The CD_TOC command returns an array of CDTOC entries. *
* Entry zero contains summary information describing how many *
* tracks the disk has and the play-time of the disk. *
* Entries 1 through N (N = Number of tracks on disk) contain *
* information about the track. *
* *
**************************************************************************)
TYPE
TOCSummaryPtr * = CPOINTER TO TOCSummary;
TOCSummary * = RECORD
firstTrack * : E.UBYTE; (* First track on disk (always 1) *)
lastTrack * : E.UBYTE; (* Last track on disk *)
END;
TOCSummaryMSFPtr * = CPOINTER TO TOCSummaryMSF;
TOCSummaryMSF * = RECORD (TOCSummary)
leadOut * : RMSF; (* Beginning of lead-out track (end of disk) *)
END;
TOCSummaryLSNPtr * = CPOINTER TO TOCSummaryLSN;
TOCSummaryLSN * = RECORD (TOCSummary)
leadOut * : RLSN; (* Beginning of lead-out track (end of disk) *)
END;
TOCEntryPtr * = CPOINTER TO TOCEntry;
TOCEntry * = RECORD
ctlAdr * : E.UBYTE; (* Q-Code info *)
track * : E.UBYTE; (* Track number *)
END;
TOCEntryMSFPtr * = CPOINTER TO TOCEntryMSF;
TOCEntryMSF * = RECORD (TOCEntry)
position * : RMSF; (* Start position of this track *)
END;
TOCEntryLSNPtr * = CPOINTER TO TOCEntryLSN;
TOCEntryLSN * = RECORD (TOCEntry)
position * : RLSN; (* Start position of this track *)
END;
CDTOCPtr * = CPOINTER TO CDTOC;
CDTOC * = RECORD END;
CDTOCMSFPtr * = CPOINTER TO CDTOCMSF;
CDTOCMSF * = RECORD (CDTOC)
summary * : TOCSummaryMSF; (* First entry (0) is summary information *)
entry * : ARRAY 256 OF TOCEntryMSF; (* Entries 1-N are track entries *)
END;
CDTOCLSNPtr * = CPOINTER TO CDTOCLSN;
CDTOCLSN * = RECORD (CDTOC)
summary * : TOCSummaryLSN; (* First entry (0) is summary information *)
entry * : ARRAY 256 OF TOCEntryLSN; (* Entries 1-N are track entries *)
END;
(**************************************************************************
* *
* Q-Code Packets *
* *
* Q-Code packets are only returned when audio is playing. *
* Currently, only position packets are returned (ADR_POSITION) *
* The other ADR_ types are almost never encoded on the disk *
* and are of little use anyway. To avoid making the QCode *
* structure a union, these other ADR_ structures are not defined. *
* *
**************************************************************************)
TYPE
QCodeMSFPtr * = CPOINTER TO QCodeMSF;
QCodeMSF * = RECORD
ctlAdr * : E.UBYTE; (* Data type / QCode type *)
track * : E.UBYTE; (* Track number *)
index * : E.UBYTE; (* Track subindex number *)
zero * : E.UBYTE; (* The "Zero" byte of Q-Code packet *)
trackPosition * : RMSF; (* Position from start of track *)
diskPosition * : RMSF; (* Position from start of disk *)
END;
QCodeLSNPtr * = CPOINTER TO QCodeLSN;
QCodeLSN * = RECORD
ctlAdr * : E.UBYTE; (* Data type / QCode type *)
track * : E.UBYTE; (* Track number *)
index * : E.UBYTE; (* Track subindex number *)
zero * : E.UBYTE; (* The "Zero" byte of Q-Code packet *)
trackPosition * : RLSN; (* Position from start of track *)
diskPosition * : RLSN; (* Position from start of disk *)
END;
CONST
ctlAdrCtlMask * = 0F0H; (* Control field *)
ctlCtlMask * = 0D0H; (* To be ANDed with CtlAdr before compared *)
ctl2Aud * = 000H; (* 2 audio channels without preemphasis *)
ctl2AudEmph * = 010H; (* 2 audio channels with preemphasis *)
ctl4Aud * = 080H; (* 4 audio channels without preemphasis *)
ctl4AudEmph * = 090H; (* 4 audio channels with preemphasis *)
ctlData * = 040H; (* CD-ROM Data *)
ctlCopyMask * = 020H; (* To be ANDed with CtlAdr before compared *)
ctlCopy * = 020H; (* When true, this audio/data can be copied *)
ctlAdrAdrMask * = 00FH; (* Address field *)
adrPosition * = 001H; (* Q-Code is position information *)
adrUPC * = 002H; (* Q-Code is UPC information (not used) *)
adrISRC * = 003H; (* Q-Code is ISRC (not used) *)
adrHybrid * = 005H; (* This disk is a hybrid disk *)
END CDDevice.